package com.gzc.just.play.last.war.common.thread;

import io.netty.channel.ChannelHandlerContext;

/**
 * 消息处理任务
 * 封装了消息处理所需的上下文信息
 */
public record MessageProcessingTask(int messageId, byte[] messageBytes, ChannelHandlerContext context,
                                    MessageHandler handler) implements Runnable {
    /**
     * 构造函数
     *
     * @param messageId    消息ID
     * @param messageBytes 消息字节数组
     * @param context      Netty通道上下文
     * @param handler      消息处理器
     */
    public MessageProcessingTask {
    }

    /**
     * 执行消息处理任务
     */
    @Override
    public void run() {
        try {
            // 反序列化消息
            Object message = handler.getDeserializer().deserialize(messageBytes);
            if (message == null) {
                handler.getLogger().error("Failed to deserialize message with ID: {}", messageId);
                return;
            }

            // 处理消息
            handler.handleMessage(message, context);
        } catch (Exception e) {
            handler.getLogger().error("Error processing message with ID: {}", messageId, e);
        }
    }

    /**
     * 获取消息ID
     *
     * @return 消息ID
     */
    @Override
    public int messageId() {
        return messageId;
    }

    /**
     * 获取消息字节数组
     *
     * @return 消息字节数组
     */
    @Override
    public byte[] messageBytes() {
        return messageBytes;
    }

    /**
     * 获取通道上下文
     *
     * @return 通道上下文
     */
    @Override
    public ChannelHandlerContext context() {
        return context;
    }

    /**
     * 获取消息处理器
     *
     * @return 消息处理器
     */
    @Override
    public MessageHandler handler() {
        return handler;
    }
}